/**
 * 全局事件管理器
 * 提供全局事件的发布、订阅、取消订阅功能
 */
export class EventManager {
    private static events: Map<string, Array<{ callback: Function; once?: boolean }>> = new Map();

    /**
     * 发布事件
     * @param eventName 事件名称
     * @param data 事件数据
     */
    static emit(eventName: string, data?: any): void {
        const listeners = this.events.get(eventName);
        if (!listeners || listeners.length === 0) {
            return;
        }

        // 创建副本，避免在回调中修改数组
        const listenersCopy = [...listeners];
        
        listenersCopy.forEach(({ callback, once }) => {
            try {
                callback(data);
            } catch (error) {
                // 事件回调执行失败
            }
        });

        // 移除一次性监听器
        if (listenersCopy.some(listener => listener.once)) {
            this.events.set(eventName, listeners.filter(listener => !listener.once));
        }
    }

    /**
     * 订阅事件
     * @param eventName 事件名称
     * @param callback 回调函数
     * @param once 是否只执行一次
     */
    static on(eventName: string, callback: Function, once: boolean = false): void {
        if (!this.events.has(eventName)) {
            this.events.set(eventName, []);
        }

        const listeners = this.events.get(eventName)!;
        
        // 检查是否已经存在相同的回调
        const existingIndex = listeners.findIndex(listener => listener.callback === callback);
        if (existingIndex !== -1) {
            // 更新现有监听器
            listeners[existingIndex] = { callback, once };
        } else {
            // 添加新的监听器
            listeners.push({ callback, once });
        }
    }

    /**
     * 订阅事件（只执行一次）
     * @param eventName 事件名称
     * @param callback 回调函数
     */
    static once(eventName: string, callback: Function): void {
        this.on(eventName, callback, true);
    }

    /**
     * 取消订阅事件
     * @param eventName 事件名称
     * @param callback 回调函数（可选，如果不传则移除该事件的所有监听器）
     */
    static off(eventName: string, callback?: Function): void {
        if (!this.events.has(eventName)) {
            return;
        }

        if (!callback) {
            // 移除该事件的所有监听器
            this.events.delete(eventName);
        } else {
            // 移除指定的监听器
            const listeners = this.events.get(eventName)!;
            const index = listeners.findIndex(listener => listener.callback === callback);
            if (index !== -1) {
                listeners.splice(index, 1);
            }
            
            // 如果没有监听器了，删除该事件
            if (listeners.length === 0) {
                this.events.delete(eventName);
            }
        }
    }

    /**
     * 获取指定事件的监听器数量
     * @param eventName 事件名称
     * @returns 监听器数量
     */
    static getListenerCount(eventName: string): number {
        const listeners = this.events.get(eventName);
        return listeners ? listeners.length : 0;
    }

    /**
     * 获取所有事件名称
     * @returns 事件名称数组
     */
    static getEventNames(): string[] {
        return Array.from(this.events.keys());
    }

    /**
     * 清除所有事件监听器
     */
    static clear(): void {
        this.events.clear();
    }

    /**
     * 获取事件管理器的统计信息
     * @returns 统计信息对象
     */
    static getStats(): { totalEvents: number; totalListeners: number; events: Record<string, number> } {
        const totalEvents = this.events.size;
        let totalListeners = 0;
        const events: Record<string, number> = {};

        this.events.forEach((listeners, eventName) => {
            const count = listeners.length;
            events[eventName] = count;
            totalListeners += count;
        });

        return {
            totalEvents,
            totalListeners,
            events
        };
    }
}

/**
 * 常用事件名称常量
 */
export const EVENT_NAMES = {
    // 医院相关事件
    HOSPITAL_CHANGE: 'hospitalChange',
    SYS_ORG_CHANGE: 'sysOrgChange',
    DEFAULT_HOSPITAL_CHANGE: 'defaultHospitalChange',
    
    // 用户相关事件
    USER_LOGIN: 'userLogin',
    USER_LOGOUT: 'userLogout',
    USER_INFO_UPDATE: 'userInfoUpdate',
    
    // 系统相关事件
    APP_READY: 'appReady',
    NETWORK_CHANGE: 'networkChange',
    LOCATION_CHANGE: 'locationChange',
    
    // 业务相关事件
    HEALTH_CODE_UPDATE: 'healthCodeUpdate',
    ORDER_STATUS_CHANGE: 'orderStatusChange',
    PAYMENT_SUCCESS: 'paymentSuccess',
    
    // 自定义事件
    CUSTOM_EVENT: 'customEvent'
} as const;

/**
 * 使用示例：
 * 
 * // 发布事件
 * EventManager.emit(EVENT_NAMES.HOSPITAL_CHANGE, { hospitalId: '123', hospitalName: '安好医院' });
 * 
 * // 订阅事件
 * EventManager.on(EVENT_NAMES.HOSPITAL_CHANGE, (data) => {
 *     // 处理医院变化逻辑
 * });
 * 
 * // 订阅一次性事件
 * EventManager.once(EVENT_NAMES.USER_LOGIN, (user) => {
 *     // 处理用户登录逻辑
 * });
 * 
 * // 取消订阅
 * EventManager.off(EVENT_NAMES.HOSPITAL_CHANGE, callback);
 * 
 * // 获取统计信息
 * const stats = EventManager.getStats();
 */
